package com.le.medium.class5;

import org.junit.Test;

/**
 * 给定一个字符串，如果该字符串符合人们日常书写一个整数的形式，返回int类 型的这个数；如果不符合或者越界返回-1或者报错
 */
public class Problem04_ConvertStringToInteger {

    public static int convert(String str){
        if (str == null || str.length() == 0){
            return 0;
        }
        char[] chars = str.toCharArray();
        if (!isValid(chars)){
            throw new RuntimeException("can not convert");
        }
        // 使用负数进行转换，因为负数范围比整数范围多一个
        boolean neg = chars[0] == '-' ? true : false; // 判断是否是一个负数
        int minq = Integer.MIN_VALUE / 10;
        int minr = Integer.MIN_VALUE % 10;
        int res = 0;
        int cur = 0;
        for (int i = neg ? 1 : 0; i < chars.length; i++) {
            cur = '0' - chars[i];
            // 防止溢出
            if (res < minq || (res == minq && cur < minr)){
                throw new RuntimeException(" can not convert");
            }
            res = res * 10 + cur;
        }
        if (!neg && res == Integer.MIN_VALUE){
            throw new RuntimeException(" can not convert");
        }
        return neg ? res : -res;
    }

    public static boolean isValid(char[] chas){
        if (chas[0] != '-' && (chas[0] < '0' || chas[0] > '9') ){
            return false;
        }
        // -0
        if (chas[0] == '-' && (chas.length == 1 || chas[1] == '0')){
            return false;
        }
        // 01,02,03...
        if (chas[0] == '0' && chas.length > 1) {
            return false;
        }
        // 0..9之间
        for (int i = 1; i < chas.length; i++) {
            if (chas[i] < '0' || chas[i] > '9') {
                return false;
            }
        }
        return true;
    }

    @Test
    public void test(){
        String str = String.valueOf(Integer.MIN_VALUE);
        System.out.println(convert(str));
        String s = String.valueOf(Integer.MAX_VALUE);
//        System.out.println(convert(s));
        String str1 = "02";
//        System.out.println(convert(str1));
        String str2 = "-0";
//        System.out.println(convert(str2));
        String str3= "-0";
//        System.out.println(convert(str3));
        String str4= "111";
//        System.out.println(convert(str4));
    }
}
